﻿// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.

using System;
using System.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Design;

namespace Microsoft.Practices.EnterpriseLibrary.Validation.Configuration
{
    /// <summary>
    /// Represents a ruleset for a validated type.
    /// </summary>
    /// <seealso cref="ValidatedTypeReference"/>
    /// <remarks>
    /// Self validation is not supported thorugh configuration.
    /// </remarks>
    /// <seealso cref="ValidatedTypeReference"/>
    [ResourceDescription(typeof(DesignResources), "ValidationRulesetDataDescription")]
    [ResourceDisplayName(typeof(DesignResources), "ValidationRulesetDataDisplayName")]
    [Command(ValidationDesignTime.CommandTypeNames.SelectValidatedTypeReferenceMembersCommand)]
    [ViewModel(ValidationDesignTime.ViewModelTypeNames.ValidationRulesetDataViewModel)]
    public class ValidationRulesetData : NamedConfigurationElement
    {
        /// <summary>
        /// <para>Initializes a new instance of the <see cref="ValidationRulesetData"/> class.</para>
        /// </summary>
        public ValidationRulesetData()
        { }

        /// <summary>
        /// <para>Initializes a new instance of the <see cref="ValidationRulesetData"/> class with a name.</para>
        /// </summary>
        /// <param name="name">The name for the instance.</param>
        public ValidationRulesetData(string name)
            : base(name)
        { }

        private const string validatorsPropertyName = "";
        /// <summary>
        /// Gets the collection of validators configured for the type owning the ruleset.
        /// </summary>
        [ConfigurationProperty(validatorsPropertyName, IsDefaultCollection = true)]
        [ConfigurationCollection(typeof(ValidatorData))]
        [ResourceDescription(typeof(DesignResources), "ValidationRulesetDataValidatorsDescription")]
        [ResourceDisplayName(typeof(DesignResources), "ValidationRulesetDataValidatorsDisplayName")]
        public ValidatorDataCollection Validators
        {
            get { return (ValidatorDataCollection)this[validatorsPropertyName]; }
        }

        private const string FieldsPropertyName = "fields";
        /// <summary>
        /// Gets the collection of validated fields for the type owning the ruleset.
        /// </summary>
        [ConfigurationProperty(FieldsPropertyName)]
        [ResourceDescription(typeof(DesignResources), "ValidationRulesetDataFieldsDescription")]
        [ResourceDisplayName(typeof(DesignResources), "ValidationRulesetDataFieldsDisplayName")]
        [PromoteCommands]
        public ValidatedFieldReferenceCollection Fields
        {
            get { return (ValidatedFieldReferenceCollection)this[FieldsPropertyName]; }
        }

        private const string MethodsPropertyName = "methods";
        /// <summary>
        /// Gets the collection of validated methods for the type owning the ruleset.
        /// </summary>
        [ConfigurationProperty(MethodsPropertyName)]
        [ResourceDescription(typeof(DesignResources), "ValidationRulesetDataMethodsDescription")]
        [ResourceDisplayName(typeof(DesignResources), "ValidationRulesetDataMethodsDisplayName")]
        [PromoteCommands]
        public ValidatedMethodReferenceCollection Methods
        {
            get { return (ValidatedMethodReferenceCollection)this[MethodsPropertyName]; }
        }

        private const string PropertiesPropertyName = "properties";
        /// <summary>
        /// Gets the collection of validated properties for the type owning the ruleset.
        /// </summary>
        [ConfigurationProperty(PropertiesPropertyName)]
        [ResourceDescription(typeof(DesignResources), "ValidationRulesetDataPropertiesDescription")]
        [ResourceDisplayName(typeof(DesignResources), "ValidationRulesetDataPropertiesDisplayName")]
        [PromoteCommands]
        public new ValidatedPropertyReferenceCollection Properties
        {
            get { return (ValidatedPropertyReferenceCollection)this[PropertiesPropertyName]; }
        }
    }
}
